#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>

int main() {
    // 定义需要映射的内存大小：128KB
    const size_t size = 128 * 1024;  // 128KB = 128 * 1024字节
    
    // 获取系统页大小（通常为4KB）
    size_t page_size = sysconf(_SC_PAGESIZE);
    printf("系统页大小: %zu 字节\n", page_size);
    
    // 检查 128KB 是否为页大小的整数倍（确保内存对齐）
    if (size % page_size != 0) {
        fprintf(stderr, "错误: 映射大小必须是页大小的整数倍\n");
        return 1;
    }
    
    // 创建匿名内存映射
    // 参数说明：
    // NULL: 让内核自动选择映射起始地址
    // size: 映射大小（128KB）
    // PROT_READ | PROT_WRITE: 映射区域可读可写
    // MAP_ANONYMOUS: 匿名映射（不关联文件）
    // MAP_PRIVATE: 私有映射（修改仅当前进程可见）
    // -1: 匿名映射时文件描述符设为-1
    // 0: 偏移量（匿名映射忽略）
    void *mapped_addr = mmap(NULL, size, PROT_READ | PROT_WRITE, 
                            MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    
    // 检查映射是否成功
    if (mapped_addr == MAP_FAILED) {
        perror("mmap 失败");
        return 1;
    }
    
    printf("匿名内存映射成功，地址: %p, 大小: %zu 字节\n", mapped_addr, size);
    
    // 操作映射的内存区域（示例：写入数据）
    char *data = (char *)mapped_addr;
    strncpy(data, "这是在匿名映射区中存储的数据", size - 1);
    data[size - 1] = '\0';  // 确保字符串结束符
    
    printf("映射区内容: %s\n", data);
    
    // 释放映射的内存
    if (munmap(mapped_addr, size) == -1) {
        perror("munmap 失败");
        return 1;
    }
    
    printf("内存映射已释放\n");
    return 0;
}
